import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

# 读取数据
df = pd.read_excel('datas.xlsx', engine='openpyxl')  # 假设文件名为datas.xlsx

# 选择特征和目标变量
X = df[['正面信息', '负面信息', '中性信息', '拥堵指数', '物价指数']].values
y = df['承压指数'].values

# 数据标准化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建DNN模型
model = Sequential()
model.add(Dense(256, input_dim=X.shape[1], activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))  # 输出层，只有一个神经元，用于预测承压指数

# 编译模型
model.compile(loss='mean_squared_error', optimizer='adam')

# 训练模型并记录历史
history = model.fit(X_train, y_train, epochs=100, batch_size=16, verbose=1, validation_data=(X_val, y_val))

# 评估模型
loss = model.evaluate(X_val, y_val)
print('Validation loss:', loss)

# 绘制学习曲线
plt.figure(figsize=(12, 4))
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

# 预测（如果需要）
# predictions = model.predict(X_val)
# for i, prediction in enumerate(predictions):
#     print(f"Prediction for sample {i}: {prediction[0]}")


# 假设你有一个新的数据点，存储在字典中

new_data = {

    '正面信息': 2656,

    '负面信息': 113,

    '中性信息': 9565,

    '拥堵指数': 2.8,

    '物价指数': 14.59

}

# 将这个数据点转换为DataFrame

new_data_df = pd.DataFrame([new_data])

# 使用相同的scaler（用于训练数据的scaler）来转换新数据

new_data_scaled = scaler.transform(new_data_df[['正面信息', '负面信息', '中性信息', '拥堵指数', '物价指数']])

# 确保新数据的形状是正确的，即它是一个二维数组，即使只有一个样本

new_data_scaled = new_data_scaled.reshape(1, -1)  # 转换为(1, 5)的形状

# 使用模型进行预测

prediction = model.predict(new_data_scaled)

# 打印预测结果

print(f"Predicted 承压指数: {prediction[0][0]}")